/**
 * 单例模式的方法
 * @param fn 方法
 * @returns 实例方法
 */
var getSingleton = function (fn: Function) {
    let result: any
    return function (this: any, ...args: any[]) {
        // 在这里判断之前是否存在过该方法
        return result || (result = fn.apply(this, args))
    }
}

interface InterfaceAnyObj {
    [key: string]: any
}

interface InterfaceDivInfo {
    html: string
    width: string
    height: string
    style: InterfaceAnyObj
}

/**
 * 创建一个弹窗的方法
 * @param divInfo 弹窗的一下信息
 * @returns 返回弹窗的实例
 */
var craeteAlertMessage = function (divInfo: InterfaceDivInfo): HTMLDivElement {
    var div: HTMLDivElement = document.createElement('div')
    div.innerHTML = divInfo.html

    for (const key in divInfo.style) {
        if (Object.prototype.hasOwnProperty.call(divInfo.style, key)) {
            (div.style as CSSStyleDeclaration)[key as any] = divInfo.style[key]
        }
    }

    div.style.height = divInfo.height
    div.style.width = divInfo.width

    return div
}

// 使用单例方法创建弹窗
var singletonCreateAlertMessage = getSingleton(craeteAlertMessage)
